package com.ce.tag;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;
import com.ce.sys.menu.dao.po.SysMenuOperations;
import com.ce.sys.role.dao.po.SysRolePermiss;
import com.ce.util.DbUtil;
import com.ce.util.MenuUtil;

/**
 * 嫦娥软件有限公司 版权所有 2013
 * 创建人： andy
 * 创建时间： 2012-3-5 下午1:04:56
 * 功能描述：
 * ==================================
 * 修改历史
 * 修改人        修改时间      修改位置（函数名）
 *
 * ==================================
 */
public class HTMLButtonTag extends TagSupport{
	private static final long serialVersionUID = 1L;
	
	/**
	 * 菜单地址，非必要属性。用于在页面中获取某个菜单项的功能按钮权限
	 * 使用举例（如字典表的权限操作，字典子表的操作权限需要与字典主表的操作权限一致，因此需要传入字典主表的菜单地址，以获取和主表相同的操作功能）
	 */
	private String menuUrl;
	
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
	    HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
	    String btnStr = "";
	    String menuId = null;
	    if(StringUtil.isNotBlank(menuUrl)){ //获取给定url的菜单的ID
	    	menuId = MenuUtil.getMenuId(menuUrl);
	    }else if(request.getAttribute("menuId")!=null){  //获取当前页面所属菜单的ID
	    	menuId = (String)request.getAttribute("menuId");
	    }
    	btnStr = this.getMenuBtnHtml(menuId, User.getUser(request));
	    JspWriter out = pageContext.getOut();
	    try{
	    	out.println(btnStr);	
	    out.flush();
		} catch (IOException ex) {
		}
		return super.doEndTag();
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-1 上午10:50:51
	 * 功能描述：根据菜单id以及当前登录人生成该用户具有的json格式的功能按钮
	 * 方法的参数和返回值
	 * @param menuid
	 * @param userid
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private String getMenuBtnHtml(String menuid,User user){
        List<?> optList = this.getMenuOperateList(menuid, user);
        Iterator<?> it = optList.iterator();
        String btnJson = "";
        while(it.hasNext()){
        	SysMenuOperations opt = (SysMenuOperations)it.next();
        	//当js函数名，按钮名，及按钮图标都不为空时，才建立按钮代码
        	if(StringUtil.isNotBlank(opt.getVcFunname())&&StringUtil.isNotBlank(opt.getVcIco())&&StringUtil.isNotBlank(opt.getVcIdname()))
	        	btnJson = btnJson + "\n<a href='javascript:void(0)' id='"+opt.getVcIdname()+
	        	"' onclick='" +opt.getVcFunname()+"()'><span><font class='"+opt.getVcIco()+
	        	"'>"+opt.getVcName()+"</font></span></a>";
        }
        if(StringUtil.isNotBlank(btnJson))
        	btnJson  = btnJson.substring(1);
        return btnJson+"\n<a href='javascript:void(0)' style=\"position:absolute;right:20px\" id='hideSearchBtn' onclick='hideSearch()' title=\"隐藏查询\"><span><font class='icon-up'></font></span></a>";
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-11-1 上午10:53:55
	 * 功能描述：根据菜单id以及当前登录人获取操作信息列表，返回的List中对象为SysMenuOperations
	 * 方法的参数和返回值
	 * @param menuid
	 * @param userid
	 * @return
	 * List   SysMenuOperations
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private List<?> getMenuOperateList(String menuid,User user){
		//超管用户返回菜单的所有操作项目
		if(user.isSuperUser())
			return DbUtil.executeHql("from SysMenuOperations po where po.vcDelFlag=0 and po.vcMenuId = '"+menuid+"' order by po.nseq");
		List<?> permissList  = DbUtil.executeHql("from SysRolePermiss po where (po.vcRoleId = 'common' or po.vcRoleId in " +
				"( select r.vcRoleId from SysAccountRole r where r.vcUserId = '"+user.getVcId()+"'))" +
			    " and po.vcMenuId = '"+menuid+"'");
		Iterator<?> it = permissList.iterator();
		String opts = "";
		while(it.hasNext()){
			SysRolePermiss permiss = (SysRolePermiss)it.next();
			if(StringUtil.isNotBlank(permiss.getVcOperation()))
				opts = opts + permiss.getVcOperation()+",";
		}
		opts = StringUtil.fromArrayToStr(StringUtil.removeRepStr(opts, ",").split(","), true);
		return DbUtil.executeHql("from SysMenuOperations po where po.vcDelFlag=0 and po.vcMenuId = '"+menuid+"' and po.vcSimpleName in ("+opts+") order by po.nseq");
	}
	
	public String getMenuUrl() {
		return menuUrl;
	}

	public void setMenuUrl(String menuUrl) {
		this.menuUrl = menuUrl;
	}

}
